package com.xp.tinyurl.client;

import com.alibaba.fastjson.JSONObject;
import com.xp.tinyurl.common.base.ResultVO;
import com.xp.tinyurl.common.base.ResultVOBuilder;
import com.xp.tinyurl.common.dto.ChangeLongUrlDTO;
import com.xp.tinyurl.common.dto.ExtendValidDTO;
import com.xp.tinyurl.common.dto.UShorter;
import com.xp.tinyurl.common.dto.UShorterUrlDTO;
import com.xp.tinyurl.common.util.HttpClientUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * @Description 生成短连接
 * @Author chengguo.pei
 * @Date 2021/9/22 15:15
 */
@Slf4j
public class TinyUrlClient {

    /**
     * 生成短连接api
     */
    private static final String GEN_TINY_URL = "/api/url/genTinyUrl";
    /**
     * 延长有效期API
     */
    private static final String EXTENT_VALID_URL = "/api/url/extendValid";

    /**
     * 延长有效期API
     */
    private static final String CHANGE_LONG_URL_API = "/api/url/changeLongUrl";
    /**
     * api前缀（系统集成可使用配置文件）
     */
    private static String reqPrefix = "";

    /**
     * 生成短链接
     */
    public static ResultVO<UShorter> create(UShorterUrlDTO shorterUrlDTO) {

        if(StringUtils.isEmpty(reqPrefix)){
            log.error("未获取到tinyUrl服务请求前缀，请联系管理员！");
            return ResultVOBuilder.failure("未获取到tinyUrl服务请求前缀，请联系管理员！");
        }
        String url = reqPrefix + GEN_TINY_URL;

        Map<String, Object> reqParams = JSONObject.parseObject(JSONObject.toJSONString(shorterUrlDTO), Map.class);
        ResultVO resultVO = null;
        try {
            resultVO = HttpClientUtils.post(url, reqParams, ResultVO.class);
        }catch (Exception e){
            log.error("请求tinyUrl服务异常", e);
        }
        if(resultVO == null){
            return ResultVOBuilder.failure("请求tinyUrl服务异常");
        }
        if(!resultVO.isSuccess()){
            return resultVO;
        }
        JSONObject shorterJson = (JSONObject)resultVO.getData();
        resultVO.setData(shorterJson.toJavaObject(UShorter.class));
        return resultVO;
    }

    /**
     * 延长短链接有效时限
     * @param extendValidDTO
     * @return
     */
    public static ResultVO extendValid(ExtendValidDTO extendValidDTO){
        if(StringUtils.isEmpty(reqPrefix)){
            log.error("未获取到tinyUrl服务请求前缀，请联系管理员！");
            return ResultVOBuilder.failure("未获取到tinyUrl服务请求前缀，请联系管理员！");
        }
        String url = reqPrefix + EXTENT_VALID_URL;

        Map<String, Object> reqParams = JSONObject.parseObject(JSONObject.toJSONString(extendValidDTO), Map.class);
        ResultVO resultVO = null;
        try {
            resultVO = HttpClientUtils.post(url, reqParams, ResultVO.class);
        }catch (Exception e){
            log.error("请求tinyUrl服务异常", e);
        }
        if(resultVO == null){
            return ResultVOBuilder.failure("请求tinyUrl服务异常");
        }
        return resultVO;
    }


    /**
     * 修改长连接地址
     * @param changeLongUrlDTO
     * @return
     */
    public static ResultVO changeLongUrl(ChangeLongUrlDTO changeLongUrlDTO){
        if(StringUtils.isEmpty(reqPrefix)){
            log.error("未获取到tinyUrl服务请求前缀，请联系管理员！");
            return ResultVOBuilder.failure("未获取到tinyUrl服务请求前缀，请联系管理员！");
        }
        String url = reqPrefix + CHANGE_LONG_URL_API;

        Map<String, Object> reqParams = JSONObject.parseObject(JSONObject.toJSONString(changeLongUrlDTO), Map.class);
        ResultVO resultVO = null;
        try {
            resultVO = HttpClientUtils.post(url, reqParams, ResultVO.class);
        }catch (Exception e){
            log.error("请求tinyUrl服务异常", e);
        }
        if(resultVO == null){
            return ResultVOBuilder.failure("请求tinyUrl服务异常");
        }
        return resultVO;
    }


}
